﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Xml.Serialization;
using System.IO;
using MySql.Data.MySqlClient;
using System.Data;
using Libreria.SICOM.Negocio;
using Libreria.SICOM.Modelo;
using System.Data.SqlClient;

namespace ConsoleMeshliumImportarDatos
{
    class Program
    {

        private static string nombreArchivo = @"info.log";
        private static string rutaArchivo = AppDomain.CurrentDomain.BaseDirectory + nombreArchivo;

        static void Main(string[] args)
        {
            ImportarDatosDeMeshlium();
        }

        private static void ImportarDatosDeMeshlium()
        {
            // Primer paso obtener la información del info.xml
            Info informacion = new Info(true);
            //Cambiamos el XMl por conexion directa a la base de datos
            string dbConn = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
            string ultimoValor = "";

            using (SqlConnection cn = new SqlConnection(dbConn))
            {
                SqlCommand cmd = new SqlCommand("SELECT MAX (CAST ( SUBSTRING ( [MUES_ID] , 2 , 50 ) AS NUMERIC ) ) As Automatico FROM [Sicom].[dbo].[MUESTRA]", cn);
                cn.Open();
                ultimoValor = cmd.ExecuteScalar().ToString();
            }


            string connectionString = ConfigurationManager.ConnectionStrings["Meshlium"].ConnectionString; //connection string
            string dataTableName = "zigbee_data_proy";
            Int32 tipoLugarG;
            Int32.TryParse(ConfigurationManager.AppSettings["tipoLugarGenerico"], out tipoLugarG);
            Int32 unidadG;
            Int32.TryParse(ConfigurationManager.AppSettings["unidadGenerica"], out unidadG);

            try
            {
                MySqlConnection mySqlConnection = new MySqlConnection(connectionString);  //creates connection
                string selectString = "Select * FROM " + dataTableName;  //selects fields to be accessed                    
                // Se comenta la linea por cambio en la consulta del sistema
                //if (informacion.Id > 0)
                if (!string.IsNullOrWhiteSpace(ultimoValor))
                {
                    // Se comenta la linea por cambio en la consulta del sistema
                    //selectString += " Where id_registro > " + informacion.Id.ToString();  //selects fields to be accessed                    
                    selectString += " Where id_registro > " + ultimoValor;  //selects fields to be accessed                    
                }
                selectString += " Order by 1 LIMIT 0 , 5000";  //selects fields to be accessed                    

                MySqlCommand mySqlCommand = mySqlConnection.CreateCommand();
                mySqlCommand.CommandText = selectString;
                MySqlDataAdapter mySqlDataAdapter = new MySqlDataAdapter();
                mySqlDataAdapter.SelectCommand = mySqlCommand;
                mySqlConnection.Open();   // opens connection

                DataSet meshliumDataSet = new DataSet();  //creates data set
                mySqlDataAdapter.Fill(meshliumDataSet, dataTableName);
                DataTable myDataTable = meshliumDataSet.Tables[dataTableName];  //i get an error here

                MuestraNegocio muestra = new MuestraNegocio();
                String cdc = ConfigurationManager.ConnectionStrings["SICOM"].ConnectionString;
                String prefijo = ConfigurationManager.AppSettings["prefijo"];
                foreach (DataRow myDataRow in myDataTable.Rows)  //iterates over rows in table
                {
                    String identificador = prefijo + myDataRow["id_registro"].ToString();
                    int tipoMuestra;
                    Int32.TryParse(myDataRow["tipo_muestra_id"].ToString(), out tipoMuestra);
                    int proyecto;
                    Int32.TryParse(myDataRow["proy_id"].ToString(), out proyecto);
                    int lugar;
                    Int32.TryParse(myDataRow["lugar_id"].ToString(), out lugar);
                    DateTime fecha;
                    DateTime.TryParse(myDataRow["fecha"].ToString(), out fecha);
                    int responsable = 0;
                    String mac = myDataRow["mac"].ToString();
                    int equipo;
                    Int32.TryParse(myDataRow["equipo_medicion"].ToString(), out equipo);
                    int variable;
                    Int32.TryParse(myDataRow["var_id"].ToString(), out variable);
                    String valor = myDataRow["valor"].ToString();

                    TipodeMuestraNegocio tpn = new TipodeMuestraNegocio();
                    TipodeMuestra tp = tpn.consultarPorIdentificador(tipoMuestra, cdc);
                    if (tp == null)
                    {
                        tpn.crearTipodeMuestra(tipoMuestra, "", "", cdc);
                    }

                    ProyectoNegocio pn = new ProyectoNegocio();
                    Proyecto p = pn.ConsultarPorIdentificador(proyecto, cdc);
                    if (p == null)
                    {
                        pn.CrearProyecto(proyecto, "", cdc);
                    }

                    LugarNegocio ln = new LugarNegocio();
                    Lugar l = ln.ConsultarPorIdentificador(lugar, cdc);
                    if (l == null)
                    {
                        ln.CrearLugar(lugar, "", "", "", "", "", "", "", tipoLugarG, cdc);
                    }

                    EquipodeMedicionNegocio emn = new EquipodeMedicionNegocio();
                    EquipodeMedicion em = emn.consultarPorIdentificador(equipo, cdc);
                    if (em == null)
                    {
                        emn.crearEquipodeMedicion(equipo, "", true, false, "", cdc);
                    }

                    VariableNegocio vn = new VariableNegocio();
                    Variable v = vn.ConsultarPorIdentificador(variable, cdc);
                    if (v == null)
                    {
                        vn.CrearVariable(variable, "", unidadG, cdc);
                    }

                    muestra.CrearMuestra(identificador, tipoMuestra, proyecto, lugar, fecha, responsable, mac, equipo, variable, valor, cdc);

                    int id;
                    int.TryParse(myDataRow["id_registro"].ToString(), out id);
                    informacion.Id = id;
                    informacion.Fecha = fecha;
                }

                mySqlConnection.Close();  //close connection
                informacion.guardarXML();
            }
            catch (Exception e)
            {
                mensajeDeEvento("Error al importar datos de Meshlium: ", e);
            }

            int lapso;
            int.TryParse(ConfigurationManager.AppSettings["lapsoDeCarga"], out lapso);
        }

        private static void mensajeDeEvento(String mensaje, Exception e)
        {
            TextWriter textWriter = new StreamWriter(rutaArchivo, true);
            textWriter.WriteLine(String.Format("-- Fecha de evento: {0} --", DateTime.Now));
            textWriter.WriteLine(mensaje);
            while (e != null)
            {
                textWriter.WriteLine(e.Message);
                e = e.InnerException;
            }
            textWriter.WriteLine("-----");
            textWriter.Close();
        }


    }

    public class Info
    {
        private String nombreArchivo = @"info.xml";
        private String rutaArchivo;
        public Int32 Id { get; set; }
        public DateTime Fecha { get; set; }

        public Info()
        {
            this.rutaArchivo = AppDomain.CurrentDomain.BaseDirectory + nombreArchivo;
        }

        public Info(Boolean importar)
        {
            this.rutaArchivo = AppDomain.CurrentDomain.BaseDirectory + nombreArchivo;
            if (importar)
            {
                this.importarDatos();
            }
        }

        public void guardarXML()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Info));
            TextWriter textWriter = new StreamWriter(this.rutaArchivo);
            serializer.Serialize(textWriter, this);
            textWriter.Close();
        }

        private void importarDatos()
        {
            if (File.Exists(this.rutaArchivo))
            {
                XmlSerializer deserializer = new XmlSerializer(typeof(Info));
                TextReader textReader = new StreamReader(this.rutaArchivo);
                Info infoTemporal = new Info(false);
                infoTemporal = (Info)deserializer.Deserialize(textReader);
                if (infoTemporal != null)
                {
                    this.Id = infoTemporal.Id;
                    this.Fecha = infoTemporal.Fecha;
                }
            }
            else
            {
                this.guardarXML();
            }
        }
    }
}
